/**
 * Copyright 2006 gworks.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 *  The greatest achievement is selflessness. The greatest worth is self-mastery.
 *  The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 *  The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 *  The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 *  The greatest goodness is a peaceful mind. The greatest patience is humility.
 *  The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 *  The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 * 
 * @author Ashin Wimalajeewa (ash)
 */
package org.javaongems.gwk.client;

import java.util.HashMap;
import java.util.Map;

import org.javaongems.std.client.AbstractViewController;

import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Widget;

public abstract class AbstractPageController
				extends AbstractViewController 
				implements PagePanel.Listener  
	{
	protected Map queryCtx = new HashMap();
	protected AbstractPageCoordinator coordinator;
	protected PagePanel pagePanel;
	
	abstract public void mountPageView();
	abstract protected String getPageName();
	abstract protected Widget getPageView();

	
	public void setUp(AbstractPageCoordinator coord) {
		coordinator = coord;
	}
	
	protected boolean canOpenPage() {
		return true;
	}
	
	protected void preparePageForQuery(Map queryMap) {
	}

	protected void openPage() {
		if (coordinator.isUrlBootstrapped())
			History.newItem(getPageName());
	}
	
	protected void closePage() {
	}
	
	public void onLeavePage(int idx, Widget from, Widget to) {
		closePage();
	}
	
	public boolean onBeforePageSelected(int idx, Widget target) {
		return canOpenPage();
	}

	public void onPageSelected(int idx, Widget target) {
		openPage();		
	}

	public void onHistoryChange(String historyToken, Map queryMap) {
		Widget view = getPageView();
		if ((pagePanel.getSelectedPage() == view) && (queryMap.equals(queryCtx)))
			return;
		queryCtx.clear(); queryCtx.putAll(queryMap);
		pagePanel.selectPage(view);
		preparePageForQuery(queryCtx);
	}

	public void setPagePanel(PagePanel panel) {
		pagePanel = panel;
	}
	
	public PagePanel getPagePanel() {
		return pagePanel;
	}
}
